/*
02-线性结构2 一元多项式的乘法与加法运算
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 1000000

typedef struct Polynomial *PtrPolynomial;
typedef struct Polynomial Polynomial;
struct Polynomial {
    int data[MAX_SIZE];
    int last;
};

PtrPolynomial create() {
    PtrPolynomial p = (PtrPolynomial) malloc(sizeof(Polynomial));
    p->last = -1;
    memset(p->data, 0, sizeof(p->data));
    return p;
}


// 读取多项式，
// 每行分别先给出多项式非零项的个数，再以指数递降方式输入一个多项式非零项系数和指数
void read(PtrPolynomial poly) {
    int n;
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        int coe; // 系数
        int exp; // 指数
        scanf("%d %d", &coe, &exp);
        if (i == 0) {
            // 第一个数是最高的指数
            poly->last = exp;
        }
        poly->data[exp] = coe;
    }
}

// 分别以指数递降方式输出多项式非零项的系数和指数
void print(PtrPolynomial poly) {
    if (poly->last < 0) {
        printf("0 0\n");
        return;
    }
    // 因题目要求但结尾不能有多余空格，
    // 先输出一项
    printf("%d %d", poly->data[poly->last], poly->last);
    // 再输出后面的数，在前面加空格
    for (int i=poly->last-1; i>=0; i--) {
        if (poly->data[i] != 0) {
            printf(" %d %d", poly->data[i], i);
        }
    }
    printf("\n");
}

void multiValue(PtrPolynomial p, int coe, int exp, PtrPolynomial result) {
    if (coe == 0) {
        return;
    }
    for (int i=0; i<= p->last; i++) {
        result->data[i+exp] += p->data[i] * coe;
    }
}

void multi(PtrPolynomial p1, PtrPolynomial p2, PtrPolynomial result) {
    result->last = p1->last + p2->last;
    for (int i=0; i<=p1->last; i++) {
        multiValue(p2, p1->data[i], i, result);
    }
}

void add(PtrPolynomial p1, PtrPolynomial p2, PtrPolynomial result) {
    result->last = p1->last > p2->last ? p1->last : p2->last;
    for (int i=0; i<=result->last; i++) {
        result->data[i] = p1->data[i] + p2->data[i];
    }
}

void updateLast(PtrPolynomial p) {
    while (p->last>=0 && p->data[p->last] == 0) {
        p->last--;
    }
}

int main() {
    // 输入的两个多项式
    PtrPolynomial p1, p2;
    // 乘，加结果
    PtrPolynomial pmult, padd;
    p1 = create();
    p2 = create();
    pmult = create();
    padd = create();

    read(p1);
    read(p2);
    // print(p1);
    // print(p2);

    multi(p1, p2, pmult);
    updateLast(pmult);
    print(pmult);

    add(p1, p2, padd);
    updateLast(padd);
    print(padd);

    return 0;
}
